/**
 * @author ghp
 * @title 删除链表倒数第N个节点
 */
class ListNode {
    int val;
    ListNode next;

    ListNode() {
    }

    ListNode(int val) {
        this.val = val;
    }

    ListNode(int val, ListNode next) {
        this.val = val;
        this.next = next;
    }
}

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        // 遍历得到链表的长度
        int len = 0;
        ListNode tempNode = head;
        while (tempNode != null) {
            tempNode = tempNode.next;
            len++;
        }
        // 判断删除的节点是否是头节点（防止后面出现NPE）
        if (len == 1 || len == n) {
            return head.next;
        }
        // 获取要删除链表的前一个节点
        int i = len - n - 1;
        tempNode = head;
        while (i != 0) {
            tempNode = tempNode.next;
            i--;
        }
        // 删除节点
        tempNode.next = tempNode.next.next;

        return head;
    }
}